#include "main.h"

// 要求将所有代码写在本文件内

int ListInitiate(SLNode **head)/*初始化 就是建立一个空表*/ {

    *head =(SLNode *) malloc(sizeof (SLNode));//初始化重新分配内存空间
    (*head)->next = NULL;//头指针为NuLL值
    return 0;
}

int ListLength(SLNode *head) /* 单链表的长度*/{
  SLNode *p = head;
  int size = 0;

  while(p->next!=NULL){
      p=p->next;
      size++;
  }

    return size;
}

int ListInsert(SLNode *head, int i, DataType x) {
  SLNode *p,*q;
  int j;

  p=head;
  j=-1;

  while (p->next!=NULL && j<i-1){
      p=p->next;
      j++;
  }

  if(j!=i-1){
      printf("参数有误");
      return 1;
  }

  q=(SLNode *) malloc(sizeof (SLNode));
  q->data = x;
  q->next = p->next;
  p->next = q;
  return 0;

}

int ListDelete(SLNode *head, int i, DataType *x) {

    SLNode *p,*s;
    int j;

    p=head;
    j=-1;

    while (p->next!=NULL&&p->next->next!=NULL && j<i-1){
        p=p->next;
        j++;
    }

    if(j!=i-1){
        printf("参数有误");
        return 0;
    }

    s=p->next;
    p->next=p->next->next;
    *x = s->data;
    free(s);

    return 1;
}

int ListGet(SLNode *head, int i, DataType *x) {

    SLNode *p;
    int j;

    p=head;
    j=-1;

    while (p->next!=NULL && j<i){
        p=p->next;
        j++;
    }
    if(j!=i){
        printf("参数有误");
        return 0;
    }

    *x = p->data;

    return 1;

}

int Destroy(SLNode **head)
{
    SLNode *p,*p1;

    p=*head;
    while(p!=NULL)
    {
        p1=p;
        p=p->next;
        free(p1);
    }
    *head=NULL;
    return 1;
}

int main(int argc, char **argv, char **env)
{
  SLNode *head;
  int i , x;
  ListInitiate(&head);/*初始化*/
  for(i = 0; i < 10; i++) {
    if(ListInsert(head, i, i+1) == 0) /*插入10个数据元素*/
      {
        printf("错误! \n");
        return 1;
      }
  }

  if(ListDelete(head, 4, &x) == 0) { /*删除数据元素5*/
    printf("错误! \n");
    return 1;
  }
  printf("%d\n", ListLength(head));

  for(i = 0; i < ListLength(head); i++) {
    if(ListGet(head, i, &x) == 0) /*取元素*/
      {
        printf("错误! \n");
        return 1;
      }
    else printf("%d    ", x);/*显示数据元素*/
  }

  Destroy(&head);

    return  0 ;
}
